package com.hongpu.mapper;

import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hongpu.domain.SysUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hongpu.domain.SysUserRole;
import com.hongpu.dto.SysUserDetailDto;
import com.hongpu.dto.TenantAdminDto;
import com.hongpu.utils.ResultDto;
import com.hongpu.vo.SysUserDetailVo;
import com.hongpu.vo.TenantAdminVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
* @author Michael zhang
* @description 针对表【sys_user(系统用户表)】的数据库操作Mapper
* @createDate 2025-05-13 14:15:24
* @Entity generator.domain.SysUser
*/
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {

    /**
     *超级管理员新增用户，新增的用户所属租户ID需要前端传递
     */
    @InterceptorIgnore(tenantLine = "true")
    public boolean ignoreTenantIdAndAddTenantAdmin(SysUser sysUser);

    /**
     * 忽略租户id的前提下,登录时根据用户账号查询用户信息
     */
    @InterceptorIgnore(tenantLine = "true")
    public SysUser ignoreTenantIdAndGetSysUserByUseraccount(String account);


    /**
     * 忽略租户id的前提下，查询用户信息
     * @param userId
     * @return
     */
    @InterceptorIgnore(tenantLine = "true")
    public String ignoreTenantIdAndGetSysUserByUserId(Long userId);

    /**
     * 忽略租户id的前提下，删除用户信息
     * @param userId
     * @return
     */
    @InterceptorIgnore(tenantLine = "true")
    public boolean ignoreTenantIdAndDeleteSysUserByUserId(@Param("userId") Long userId,@Param("updateBy") Long updateBy);

    /**
     * 忽略租户id的前提下，启用租户信息
     */
    @InterceptorIgnore(tenantLine = "true")
    public boolean ignoreTenantIdAndActiveSysUserByUserId(@Param("userId") Long userId,@Param("updateBy") Long updateBy);

    /**
     * 忽略租户id的前提下，查询租户信息
     */
    @InterceptorIgnore(tenantLine = "true")
    public TenantAdminVo ignoreTenantIdAndDetailSysUserByUserId(Long userId);

    /**
     * 忽略租户id的前提下，查询租户分页
     */
    @InterceptorIgnore(tenantLine = "true")
    public IPage<TenantAdminVo> ignoreTenantIdAndPageTenantAdmin(@Param("ipage") IPage ipage,@Param("tenantAdminDto") TenantAdminDto tenantAdminDto);


    /**
     * 忽略租户id的前提下，根据传递的租户ID将租户ID下所有用户 deleted 字段设置为1。适用场景：租户停用或暂停状态下，该租户下所有用户不能登录
     */
    @InterceptorIgnore(tenantLine = "true")
    public boolean ignoreTenantIdAndUpdateStatusDeleted(@Param("tenantId") Long tenantId,@Param("updateBy") Long updateBy);

    /**
     * 忽略租户id的前提下，根据传递的租户ID将该租户ID下所有用户 deleted 字段设置为0。适用场景：租户启用下状态，该租户下所有用户都可以登录
     */
    @InterceptorIgnore(tenantLine = "true")
    public boolean ignoreTenantIdAndUpdateStatusActive(@Param("tenantId") Long tenantId,@Param("updateBy") Long updateBy);

    /**
     * 忽略租户id的前提下，修改租户信息
     */
    @InterceptorIgnore(tenantLine = "true")
    public boolean ignoreTenantIdAndUpdateTenantAdmin(TenantAdminDto tenantAdminDto);
    /**
     * 忽略租户id的前提下，修改租户管理员密码
     */
    @InterceptorIgnore(tenantLine = "true")
    public boolean ignoreTenantIdAndUpdateTenantAdminPassword(TenantAdminDto tenantAdminDto);

    /**
     * 查询租户管理员角色ID
     */
    public Long getTenantAdminRoleId();
    /**
     * 将用户ID和用户角色ID数据保存到sys_user_role表中
     */
    public boolean addUserRole(SysUserRole sysUserRole);


    /**
     * 租户的管理员启用普通用户
     *
     * @param id
     */
    public boolean activeById(@Param("id") Long id,@Param("updateBy") Long updateBy);
    /**
     * 租户管理员查询普通用户分页
     */
    @InterceptorIgnore(tenantLine = "true")
    public IPage<SysUserDetailVo> selectSysUserDetailVoPage(@Param("ipage") IPage ipage, @Param("sysUserDetailDto") SysUserDetailDto sysUserDetailDto);


    /**
     * 根据用户ID查询用户角色名称
     */
    @InterceptorIgnore(tenantLine = "true")
    public List<String> getRoleNamesByUserId(@Param("userId") Long userId,@Param("tenantId") Long tenantId);

    /**
     * 根据用户名和租户ID查询用户信息
     */
    @InterceptorIgnore(tenantLine = "true")
    public SysUser selectSysUserByUsernameAndTenantId(@Param("username") String username,@Param("tenantId") Long tenantId);

    /**
     * 超级管理员在租户下新增租户管理员时，根据选择的租户ID查询该租户下是否有管理员用户
     */
    @InterceptorIgnore(tenantLine = "true")
    public SysUser getTenantAdminByTenantId(Long tenantId);
}




